USE [GLDW]
GO
/****** Object:  UserDefinedFunction [dbo].[LDW_THURSDAY_BASE_WEEK_FUNC]    Script Date: 12/09/2013 11:26:00 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/*
  ***************************************************************************
  Create Date  : 2013-01-11
  Initionalize : 전영욱 K
  Func Name    : [LDW_THURSDAY_BASE_WEEK_FUNC]
  Desc         : 주단위 체제에 대응한 NEW WEEK BASE
	@RETURN_TYPE 설명
		YYYY   : 입력받은 날짜의 WEEK BASE 년도를 4자리 수 리턴
		M	   : 입력받은 날짜의 WEEK BASE 월을 유동 1~2 자리 수 리턴
		MM	   : 입력받은 날짜의 WEEK BASE 월을 2 자리 수 리턴
		MMM    : 입력받은 날짜의 WEEK BASE 월을 3자리 수 영문 월로 리턴(Jan, Feb, ...)
		YYYYMM : 입력받은 날짜의 WEEK BASE 년월을 6자리 수 리턴
		YYYYWW : 입력받은 날짜의 WEEK BASE 년도 4자리 + WEEK 2자리 리턴
		WEEK   : 입력받은 날짜의 주차를 4자리 수 리턴(W 01, W 02, ...)
		

	Addition : 
		2013.03.06 원래 취지는 주단위 체제가 기존 월요일 기준에서 목요일 기준으로 바뀌면서
					GLOW의 로직들도 변경할 부분이 많이 생겼는데, 변경해야 할 함수들에서 이 함수를
					호출해서 처리하도록 함으로써, 좀더 편하게 관리하려던 목적이었으나, 
					함수에서 함수를 호출하는 것은 속도상의 문제라든가, 기타 이유로 아니다 라는 결론에 도달
					따라서, 폐기 상태로 넘어가려던 함수였으나, IOD 매출 예정 KPI를 신규로 개발하면서
					이 함수에 기능을 추가해 사용하게 됨

					@RETURN_TYPE 추가된 사항
						MMMYYYY   : 입력받은 날짜의 WEEK BASE MMM YYYY를 8자리 수 리턴 (ex : 'Jan 2013')
						WEEK23	  : 입력받은 날짜의 WEEK BASE 주차 정보를 2~3자리 수로 리턴 (ex : 'W2', 'W13')
						WEEKFRTO  : 입력받은 날짜의 WEEK BASE 주차 정보를 FROM,TO로 표시해서 리턴 (ex : 'W3(1/14~1/20)')
						DDMMM	  : 입력받은 날짜를 DD-MMM 형태로 리턴 (ex : '20-Jan')
					
  ***************************************************************************
  */
ALTER FUNCTION [dbo].[LDW_THURSDAY_BASE_WEEK_FUNC] 
(
	 @RET_TYPE VARCHAR(20)	-- YYYY, MM, YYYYMM, WEEK
	 ,@INPUT_DATE DATE
)
RETURNS VARCHAR(20)
AS

BEGIN
	
	DECLARE @CURR_WEEKNUM		INT			-- 1 일요일, 2 월요일 ..., 7 토요일
		, @DIFF					INT			-- 목요일과의 차이값(한 주가 월~일 이므로, 일요일의 경우엔 -3이 되어야 한다)
		, @THURSDAY_YYYYMMDD	DATETIME	-- 목요일의 날짜
		, @RET_VALUE			VARCHAR(20)	-- 리턴할 값
		, @FIRSTDAY_WEEKNUM		INT			-- 목요일이 속한 년도의 1월 1일이 무슨 요일인지 파악
		, @WEEK_CORRECTION		INT			-- 1월 1일이 금, 토 이면 WEEK값을 하나 빼주어야 한다.
		, @TMP_MONDAY			DATETIME
		, @TMP_SUNDAY			DATETIME
		, @TMP_DAY				INT
		
	
	SET @CURR_WEEKNUM = DATEPART(DW, @INPUT_DATE);
	SET @DIFF = CASE WHEN @CURR_WEEKNUM = 1 THEN -3	ELSE 5 - @CURR_WEEKNUM END;
	SET @THURSDAY_YYYYMMDD = DATEADD(DAY, @DIFF, @INPUT_DATE);
	SET @FIRSTDAY_WEEKNUM = DATEPART(DW,CONVERT(DATE,CONVERT(VARCHAR(4),YEAR(@THURSDAY_YYYYMMDD)) + '-01-01')) 	
	
	IF @FIRSTDAY_WEEKNUM = 6 OR @FIRSTDAY_WEEKNUM = 7
		SET @WEEK_CORRECTION = -1
	ELSE
		SET @WEEK_CORRECTION = 0



	IF UPPER(@RET_TYPE) = 'YYYY'
		BEGIN
			SET @RET_VALUE = YEAR(@THURSDAY_YYYYMMDD)
		END

	ELSE IF UPPER(@RET_TYPE) = 'M'
		BEGIN
			SET @RET_VALUE = MONTH(@THURSDAY_YYYYMMDD)
		END		

	ELSE IF UPPER(@RET_TYPE) = 'MM'
		BEGIN
			SET @RET_VALUE = DATENAME(M, @THURSDAY_YYYYMMDD)
		END		

	ELSE IF UPPER(@RET_TYPE) = 'MMM'
		BEGIN
			SET @RET_VALUE =			
				CASE DATENAME(M, @THURSDAY_YYYYMMDD) 
					WHEN '01' THEN 'Jan'
					WHEN '02' THEN 'Feb'
					WHEN '03' THEN 'Mar'
					WHEN '04' THEN 'Apr'
					WHEN '05' THEN 'May'
					WHEN '06' THEN 'Jun'
					WHEN '07' THEN 'Jul'
					WHEN '08' THEN 'Aug'
					WHEN '09' THEN 'Sep'
					WHEN '10' THEN 'Oct'
					WHEN '11' THEN 'Nov'
					WHEN '12' THEN 'Dec'
				END		
		END
						

	ELSE IF UPPER(@RET_TYPE) = 'YYYYMM'
		BEGIN
			SET @RET_VALUE = CONVERT(VARCHAR(6), @THURSDAY_YYYYMMDD, 112)
		END

	ELSE IF UPPER(@RET_TYPE) = 'WEEK'
		BEGIN		
			SET @RET_VALUE =
				CASE 
					WHEN DATEPART(WEEK, @THURSDAY_YYYYMMDD)+@WEEK_CORRECTION < 10 
						THEN 'W 0' + CONVERT(VARCHAR(2), DATEPART(WEEK, @THURSDAY_YYYYMMDD)+@WEEK_CORRECTION)
					WHEN DATEPART(WEEK, @THURSDAY_YYYYMMDD)+@WEEK_CORRECTION >= 10 
						THEN 'W ' + CONVERT(VARCHAR(2), DATEPART(WEEK, @THURSDAY_YYYYMMDD)+@WEEK_CORRECTION)
				END
		END
		
	ELSE IF UPPER(@RET_TYPE) = 'YYYYWW'
		BEGIN
			SET @RET_VALUE = CONVERT(VARCHAR(4),YEAR(@THURSDAY_YYYYMMDD)) + 
				CASE 
					WHEN DATEPART(WEEK, @THURSDAY_YYYYMMDD)+@WEEK_CORRECTION < 10 
						THEN '0' + CONVERT(VARCHAR(1), DATEPART(WEEK, @THURSDAY_YYYYMMDD)+@WEEK_CORRECTION)
					WHEN DATEPART(WEEK, @THURSDAY_YYYYMMDD) >= 10 
						THEN CONVERT(VARCHAR(2), DATEPART(WEEK, @THURSDAY_YYYYMMDD)+@WEEK_CORRECTION)
				END
		END

	ELSE IF UPPER(@RET_TYPE) = 'MMMYYYY'
		BEGIN
			SET @RET_VALUE = 
				CASE DATENAME(M, @THURSDAY_YYYYMMDD) 
					WHEN '01' THEN 'Jan'
					WHEN '02' THEN 'Feb'
					WHEN '03' THEN 'Mar'
					WHEN '04' THEN 'Apr'
					WHEN '05' THEN 'May'
					WHEN '06' THEN 'Jun'
					WHEN '07' THEN 'Jul'
					WHEN '08' THEN 'Aug'
					WHEN '09' THEN 'Sep'
					WHEN '10' THEN 'Oct'
					WHEN '11' THEN 'Nov'
					WHEN '12' THEN 'Dec'
				END	+ ' ' + CONVERT(VARCHAR(4),YEAR(@THURSDAY_YYYYMMDD))
		END
	ELSE IF UPPER(@RET_TYPE) = 'WEEK23'
		BEGIN
			SET @RET_VALUE = 'W' + CONVERT(VARCHAR(2), DATEPART(WEEK, @THURSDAY_YYYYMMDD)+@WEEK_CORRECTION)
		END		
	ELSE IF UPPER(@RET_TYPE) = 'WEEKFRTO'
		BEGIN
			SET @TMP_MONDAY = DATEADD(DAY, -3, @THURSDAY_YYYYMMDD)
			SET @TMP_SUNDAY = DATEADD(DAY, +3, @THURSDAY_YYYYMMDD)
			SET @RET_VALUE = 'W' + CONVERT(VARCHAR(2), DATEPART(WEEK, @THURSDAY_YYYYMMDD)+@WEEK_CORRECTION)
								+ '('
								+ CONVERT(VARCHAR(2), DATEPART(MONTH, @TMP_MONDAY))
								+ '/'
								+ CONVERT(VARCHAR(2), DATEPART(DAY, @TMP_MONDAY))
								+ '~'
								+ CONVERT(VARCHAR(2), DATEPART(MONTH, @TMP_SUNDAY))
								+ '/'
								+ CONVERT(VARCHAR(2), DATEPART(DAY, @TMP_SUNDAY))
								+ ')'
		END
	ELSE IF UPPER(@RET_TYPE) = 'DDMMM'
		BEGIN
			SET @TMP_DAY = DATEPART(DAY, @INPUT_DATE)
			SET @RET_VALUE = 
				CASE WHEN @TMP_DAY < 10 THEN '0' + CONVERT(VARCHAR(1), @TMP_DAY)
					 ELSE CONVERT(VARCHAR(2), @TMP_DAY)
				END + '-' +
				CASE DATENAME(M, @INPUT_DATE) 
					WHEN '01' THEN 'Jan'
					WHEN '02' THEN 'Feb'
					WHEN '03' THEN 'Mar'
					WHEN '04' THEN 'Apr'
					WHEN '05' THEN 'May'
					WHEN '06' THEN 'Jun'
					WHEN '07' THEN 'Jul'
					WHEN '08' THEN 'Aug'
					WHEN '09' THEN 'Sep'
					WHEN '10' THEN 'Oct'
					WHEN '11' THEN 'Nov'
					WHEN '12' THEN 'Dec'
				END
			
		END
	ELSE
		BEGIN
			SET @RET_VALUE = 'ERROR'
		END		
	
	RETURN @RET_VALUE;

END


--SELECT dbo.LDW_THURSDAY_BASE_WEEK_FUNC('YYYY', '2013-01-01')
--SELECT dbo.LDW_THURSDAY_BASE_WEEK_FUNC('M', '2013-02-04')
--SELECT dbo.LDW_THURSDAY_BASE_WEEK_FUNC('MM', '2013-01-01')
--SELECT dbo.LDW_THURSDAY_BASE_WEEK_FUNC('MMM', '2013-01-01')
--SELECT dbo.LDW_THURSDAY_BASE_WEEK_FUNC('YYYYMM', '2013-01-01')
--SELECT dbo.LDW_THURSDAY_BASE_WEEK_FUNC('YYYYWW', '2013-11-01')
--SELECT dbo.LDW_THURSDAY_BASE_WEEK_FUNC('WEEK', '2012-12-31')
